package 传智播客_黑马.java高级.reflect反射;

//反射: 将类的各个组成部分封装成对象：eg：类的成员变量Field[] fields，构造方法Constructor[] constructors，类的方法method[] methods……
//1.程序编译后生成字节码文件是第一个阶段，这时候这个字节码文件还没有进入内存中（源代码阶段：source阶段）；
// 2.在java里有一个“类加载器：ClassLoader”，它会将这个字节码文件加载到内存中，在java里还有一个类叫Class，
// 他会把类的各个部分分成各个对象，然后我们通过这个Class类的行为就可以对Person类进行操作，（Class阶段）
//3.runnable阶段了，就是程序运行阶段了,就是可以直接new了
//反射的好处：1.在程序运行阶段我们可以操作他，2.可以解耦，增加程序的扩展性
public class GetClass {

    public static void main(String[] args) throws ClassNotFoundException {
//        获取Class对象的方法：1.Class.forName(完整路径（包名.类名）),程序处于第一阶段 (forName是Class类里的静态方法)
        Class cls = Class.forName("传智播客_黑马.java高级.reflect反射.Person");
        System.out.println(cls);

//        2.第二阶段，类名.class
        Class<Person> personClass = Person.class;
        System.out.println(personClass);

//        3.第三阶段：对象.getClass getClass方法是封装在Object里的方法，所以每个类都可以使用
        Class aClass = new Person().getClass();
        System.out.println(aClass);

//        说明无论用哪一种方法获取Class类，都是同一个（“==”比的是地址），也就是说，程序运行中，一个类只会加载一次，所对应的Class也只有一个
        System.out.println(cls == personClass);
        System.out.println(personClass == aClass);
    }
}
